Appearance
NFS 在 Linux 上的使用
NFS 为 Network FileSystem 的简称,它的目的就是想让不同的机器、不同的操作系统可以彼此分享文件!
NFS Server 端的设定
查看是否安装 NFS
sh
$ rpm -qa | grep nfs
$ rpm -qa | grep rpcbind
安装 NFS
sh
$ yum install nfs-utils
配置 NFS
sh
$ vim /etc/exports
/www/filestore/ 192.168.0.0/24(rw,sync,no_root_squash)
[分享目录] [IP网段(权限)]
- 权限常见参数值 (就是小括号内的参数)
参数值 | 内容说明 |
---|---|
rw ro | 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。 |
sync async | sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘! |
no_root_squash root_squash | 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份? 默认的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。 但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行! |
all_squash | 不论登入 NFS 的用户身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦! |
anonuid anongid | anon 意指 anonymous (匿名者) ,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值! 当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。 |
启动 NFS
sh
$ systemctl start rpcbind
$ systemctl start nfs
查看 RPC 服务注册情况
rpcinfo -p [IP|hostname]
rpcinfo -t|-u IP|hostname 程序名称
选项与参数:
-p :针对某 IP (不写默认为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某个程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某个程序检查其 UDP 封包所在的软件版本;
sh
# 显示出目前本机的 RPC 状态
$ rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 1002 mountd
100005 1 tcp 1002 mountd
100005 2 udp 1002 mountd
100005 2 tcp 1002 mountd
100005 3 udp 1002 mountd
100005 3 tcp 1002 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 30001 nlockmgr
100021 3 udp 30001 nlockmgr
100021 4 udp 30001 nlockmgr
100021 1 tcp 30001 nlockmgr
100021 3 tcp 30001 nlockmgr
100021 4 tcp 30001 nlockmgr
# 程序代号 NFS 版本 封包类型 端口 服务名称
# 针对 nfs 这个程序检查其相关的软件版本信息 (仅察看 TCP 封包)
$ rpcinfo -t localhost nfs
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
# 可以发现提供 nfs 的版本共有两种,分別是 3, 4
查看 NFS 状态
showmount [-ae] [hostname|IP]
选项与参数:
-a :显示目前主机与用戶端的 NFS 连线分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录资料。
- 显示出刚刚我们所设定好的相关 exports 分享目录信息
sh
$ showmount -e localhost
Export list for localhost:
/www/filestore 192.168.0.0/24
查看 NFS 默认参数
sh
$ tail /var/lib/nfs/etab
/www/filestore 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)
重新加载 NFS 配置文件
exportfs [-aruv]
-a :全部挂载(或卸载) /etc/exports 里面的设定
-r :重新挂载 /etc/exports 裡面的設定,此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的內容!
-u :卸載某一目錄
-v :在 export 的時候,將分享的目錄顯示到螢幕上!
- 重新挂载一次 /etc/exports 的设定
sh
$ exportfs -arv
- 将已经分享的 NFS 目录资源,通通都卸载
sh
$ exportfs -auv
# 这时如果你再使用 showmount -e localhost 就会看不到任何资源了!
NFS 的安全性
- NFS 端口的设定问题与解决方案:
一般来说, NFS 的服务仅会对内部网域开放,不会对因特网开放的。 然而,如果你有特殊需求的话, 那么也可能会跨不同网域就是了。 但是,NFS 的防火墙特别难搞,为什么呢? 因为除了固定的 port 111, 2049 之外, 还有很多不固定的端口是由 rpc.mountd, rpc.rquotad 等服务所开启的,所以,你的 iptables 就很难设定规则! 那怎办? 难道整个防火墙机制都要取消才可以?
为了解决这个问题, CentOS 7.x 有提供一个固定特定 NFS 服务的端口配置文件,那就是 /etc/sysconfig/nfs 啦!你在这个档案里面就能够指定特定的埠口,这样每次启动 nfs 时,相关服务启动的端口就会固定,如此一来, 我们就能够设定正确的防火墙啰! 这个配置文件内容很多,绝大部分的数据你都不要去更改,只要改跟 PORT 这个关键词有关的数据即可。 那么需要更改的 rpc 服务有哪些呢? 主要有 mountd, nlockmgr ,所以你应该要这样改:
sh
$ vim /etc/sysconfig/nfs
LOCKD_TCPPORT=30001
LOCKD_UDPPORT=30001
MOUNTD_PORT=1002
# 记得去掉注释,端口的值你也可以自行決定。
$ systemctl restart nfs #重新启动 NFS
$ rpcinfo -p | grep -E '(mount|nlock)' #查看端口是否生效
- 开启防火墙
sh
$ firewall-cmd --permanent --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp --add-port=30001/tcp --add-port=30001/udp --add-port=1002/tcp --add-port=1002/udp
$ firewall-cmd --reload
NFS 客户端的设定
手动挂载 NFS 服务器分享的资源
sh
# 启动 rpcbind
$ systemctl start rpcbind
# 查询服务器提供哪些资源
$ showmount -e 192.168.0.204
Export list for 192.168.0.204:
/www/filestore 192.168.0.0/24
# 本地建立挂载目录
$ mkdir /www/filestore/204
# 将本地目录挂载到服务器
$ mount -t nfs 192.168.0.204:/www/filestore /cfs/204
# 注意一下挂载的语法!『 -t nfs 』指定目录系统类型,IP:/dir 則是指定某一部主机的某個提供的目錄!
# 查看挂载状态
$ df -h
Filesystem Size Used Avail Use% Mounted on
...(中间省略)...
192.168.0.204:/www/filestore 46G 1.5G 44G 4% /www/filestore/204
NFS 挂载参数
sh
$ mount -t nfs -o bg,soft,rsize=32768,wsize=32768 192.168.0.204:/www/filestore /cfs/204
参数 | 参数功能 | 默认参数 |
---|---|---|
fg bg | 当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行? 若在前景执行时,则 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 则 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用 bg 比较妥当。 | fg |
soft hard | 如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续的呼叫,直到对方恢复联机为止。 如果是 soft 的话,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系统的延迟会比较不这么明显。 同上,如果你的服务器可能开开关关,建议用 soft 喔! | hard |
intr | 当你使用上头提到的 hard 方式挂载时,若加上 intr 这个参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。 | 没有 |
rsize wsize | 读出(rsize)与写入(wsize)的区块大小 (block size)。 这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量。 一般来说, 如果在局域网络内 (LAN) ,并且客户端与服务器端都具有足够的内存,那这个值可以设定大一点, 比如说 32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力! 但要注意设定的值也不要太大,最好是达到网络能够传输的最大值为限。 | rsize=1024 wsize=1024 |
卸载 NFS
sh
$ umount /www/filestore/204
开机自动挂载 NFS
sh
$ vim /etc/rc.d/rc.local
mount -t nfs -o bg,soft,rsize=32768,wsize=32768 192.168.0.204:/www/filestore /cfs/204
# 必须确保 /etc/rc.d/rc.local 有执行权限
$ chmod +x /etc/rc.d/rc.local